package br.com.gustavobhz.portalcolaborador.pages.usuario;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.tapestry5.EventConstants;
import org.apache.tapestry5.OptionModel;
import org.apache.tapestry5.SelectModel;
import org.apache.tapestry5.ValueEncoder;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.internal.OptionModelImpl;
import org.apache.tapestry5.internal.SelectModelImpl;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.services.BeanModelSource;
import org.apache.tapestry5.beaneditor.BeanModel;
import org.hibernate.Session;
import org.hibernate.exception.DataException;

import br.com.gustavobhz.portalcolaborador.dao.CrudServiceDAO;
import br.com.gustavobhz.portalcolaborador.encoder.FuncionarioEncoder;
import br.com.gustavobhz.portalcolaborador.entidade.Funcionario;
import br.com.gustavobhz.portalcolaborador.entidade.GenericDAO;
import br.com.gustavobhz.portalcolaborador.entidade.Usuario;

public class Cadastro {
	
	@Property
	@Persist
	private Usuario usuario;

	@Inject
	private Session session;
	
    @Component(id="cadastroForm")
    private Form form;
    
	@Inject
	private Messages messages;

	@Persist("flash")
	private String mensagemSucesso;
	
	@Persist("flash")
	private String message;
	
	//form
    @Property
	private String nome;
	
    @Property
	private String senha;
    
    @Property
    private Date dataCriacao = new java.sql.Date(System.currentTimeMillis()); //Data atual do sistema
    
    @Property
    private boolean ativo = true;
    
    @Property
	private String contexto;
    
    @Inject
    CrudServiceDAO crudDAO;
    
    private List<Funcionario> funcionarios = new ArrayList<Funcionario>();
    
    private GenericDAO dao;
    
    @Property
    private Funcionario funcionario;
    
    //BeanModel
    private BeanModel<Usuario> usuarioRow;
    
    @Inject
    private BeanModelSource beanModelSource;
    
    
    private static final String MENSAGEM_SUCESSO = "sucesso";
	
	public void onActivate() {
		if(usuario.getId() > 0) {
			usuario = new Usuario();
		}
	}
	
	public void onActivate(String contexto) {
		if(contexto.equals("novo")) {
			usuario = new Usuario();
		}
	}
	
	//Formulário
	@OnEvent(component="cadastroForm", value = EventConstants.SUCCESS)
	void onSuccess() {
		try {
	        gravar();
	        setMessage(messages.get(MENSAGEM_SUCESSO));
		} catch (DataException ex) {
			form.recordError("A operação não pode ser realizada, consulte o administrador do sistema.");
		}
			setMessage(messages.get(MENSAGEM_SUCESSO));
	}
	 
	@CommitAfter
	void gravar() {
		this.usuario.setNome(this.nome.toLowerCase());
		this.usuario.setSenha(this.senha.toLowerCase());
		this.usuario.setDataCriacao(this.dataCriacao);
		this.usuario.setAtivo(this.ativo);
		this.usuario.setFuncionario(this.funcionario);
		final GenericDAO dao = new GenericDAO(session, Usuario.class);
        dao.gravar(usuario);
        usuario = new Usuario();
	}
	
	
	
	public SelectModel getFuncionarioSM() {
		final GenericDAO dao = new GenericDAO(session, Funcionario.class);
		final List<Funcionario> funcionarios = (List<Funcionario>) dao.getList();
		final OptionModel[] options = new OptionModel[funcionarios.size()];
		
		for (int i = 0; i < options.length; i++) {
			Funcionario funcionario = funcionarios.get(i);
			String nome = funcionario.getNome();
			options[i] = new OptionModelImpl(nome, funcionario);
		}
		return new SelectModelImpl(options);
	}
	
	//GRID
    public List<?> getListarUsuario() {
        final GenericDAO dao = new GenericDAO(session, Usuario.class);
        return dao.getList(); 
    }
    
    public void onActionFromRemover(long id) {
        remover(id);
    }
 
    @CommitAfter
    public void remover(long id) {
        final GenericDAO dao = new GenericDAO(session, Usuario.class);
        dao.deleteById(id);
    }
    
    //Validando formulário
    public void onValidateFromCadastroForm() {
    	
    	if(this.nome == null) {
    		form.recordError("O nome do usuário deve ser preenchido!");
    	}
    	
    	if(this.senha == null) {
    		form.recordError("A senha do usuário deve ser preenchido!");
    	}
    	
    }
    
    @OnEvent(value = "cancelar")
    void cancelarUsuario() {
    	crudDAO.delete(Usuario.class, usuario.getId());
    }
    
    
    //GRID - ROW
    public BeanModel<Usuario> getModel() {
		BeanModel<Usuario> model = beanModelSource.createDisplayModel(Usuario.class, messages);
		 model.add("funcionario", null);
		 model.add("remover", null);
		 model.add("editar", null);
		 model.get("nome").sortable(false);
		return model;
    }
    
    //getters and setters
    
	public Messages getMessages() {
		return messages;
	}

	public void setMessages(Messages messages) {
		this.messages = messages;
	}

	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public GenericDAO getDao() {
		return dao;
	}

	public void setDao(GenericDAO dao) {
		this.dao = dao;
	}

	public BeanModel<Usuario> getUsuarioRow() {
		return usuarioRow;
	}

	public void setUsuarioRow(BeanModel<Usuario> usuarioRow) {
		this.usuarioRow = usuarioRow;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
}